package com.sh.util;

 
import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.util.Random;

 

import org.apache.shiro.codec.Hex;

 

public class MD5Util {

 

         /**

          * 普通MD5加密<br> 

          *  

          * @param input

          * @return

          */

        public static String MD5(String input) { 

            MessageDigest md5 = null; 

            try { 

                md5 = MessageDigest.getInstance("MD5"); 

            } catch (NoSuchAlgorithmException e) { 

                return "check jdk"; 

            } catch (Exception e) { 

                e.printStackTrace(); 

                return ""; 

            } 

            char[] charArray = input.toCharArray(); 

            byte[] byteArray = new byte[charArray.length]; 

     

            for (int i = 0; i < charArray.length; i++) 

                byteArray[i] = (byte) charArray[i]; 

            byte[] md5Bytes = md5.digest(byteArray); 

            StringBuffer hexValue = new StringBuffer(); 

            for (int i = 0; i < md5Bytes.length; i++) { 

                int val = ((int) md5Bytes[i]) & 0xff; 

                if (val < 16) 

                    hexValue.append("0"); 

                hexValue.append(Integer.toHexString(val)); 

            } 

            return hexValue.toString(); 

     

        } 

      

          

          

          

            /**

             * 加盐MD5加密<br>

             *

             * @param password

             * @return

             */

            public static String getMD5(String password) { 

                Random r = new Random(); 

                StringBuilder sb = new StringBuilder(16); 

                sb.append(r.nextInt(99999999)).append(r.nextInt(99999999)); 

                int len = sb.length(); 

                if (len < 16) { 

                    for (int i = 0; i < 16 - len; i++) { 

                        sb.append("0"); 

                    } 

                } 

                String salt = sb.toString(); 

                password = md5Hex(password + salt); 

                char[] cs = new char[48]; 

                for (int i = 0; i < 48; i += 3) { 

                    cs[i] = password.charAt(i / 3 * 2); 

                    char c = salt.charAt(i / 3); 

                    cs[i + 1] = c; 

                    cs[i + 2] = password.charAt(i / 3 * 2 + 1); 

                } 

                return new String(cs); 

            } 

     

            /**

             * 校验加盐后是否和原文一致<br>

             *  

             * @param password

             * @param md5

             * @return

             */

            public static boolean verify(String password, String md5) { 

               try {

                   char[] cs1 = new char[32]; 

                    char[] cs2 = new char[16]; 

                    for (int i = 0; i < 48; i += 3) { 

                        cs1[i / 3 * 2] = md5.charAt(i); 

                        cs1[i / 3 * 2 + 1] = md5.charAt(i + 2); 

                        cs2[i / 3] = md5.charAt(i + 1); 

                    } 

                    String salt = new String(cs2); 

                    return md5Hex(password + salt).equals(new String(cs1)); 

               } catch (Exception e) {

                   return false;

               }

               

            } 

     

            /** 

             * 获取十六进制字符串形式的MD5摘要 

             */ 

            private static String md5Hex(String src) { 

                try { 

                    MessageDigest md5 = MessageDigest.getInstance("MD5"); 

                    byte[] bs = md5.digest(src.getBytes()); 

                    return new String(new Hex().encode(bs)); 

                } catch (Exception e) { 

                    return null; 

                } 

            } 

    }


